<改变未来的算法> 笔记
搜索引擎
简要的说,一次搜索包含了: 匹配,排名。
匹配
这里的主要概念就是索引。(想象一下字典) 首先需要知道词出现在哪里
建立词表,记录每个词出现的地方(页面)
当进行多词搜索,进行多次匹配也就可以了。但是,如果需要进行连续词搜索,那我们还需要知道词的位置。
索引信息中记录词的位置(第1个,第10个,。。。)
这个做完了之后,我们还可以进行元词搜索,考虑当前html的结构,=<title>=,=<body>=等标签,记录开始和闭合的节点问题,即可进行例如=key:inTitle=类型的搜索
PageRank
排名
匹配完成后,还有一个重要的事情就是排名,找到最接近查找的内容。但是同样一个词,计算机如何去理解什么是最接近的? 可选的办法就是:*权重,计分*
- 计分:
考虑使用引用次数进行计分,亦即页面超链接在其他页面中的次数。
- 权重:
1000个人引用的网页和1个人引用的网页,其内容的权威程序大体上也应该可以体现。
将页面权重设置为所有引用其页面的页面权重之和
以上看起来像解决了问题,但是这样,会出现一个问题,=循环引用=–cycle
随机访问者算法。
公钥加密
当信息交换双方协商好一种加密密钥(类似加密字典),简单的加密也就可以进行了。下面探讨的主要是,如何公共的协商出一种密钥。
- 首先考虑一个问题,如何利用公共的信息得到一个秘密。假设有这种一个操作可以。那:
操作本身可交换(协议双方的操作顺序无关),操作本身不可逆(不唯一)
3 mod 11 = 3; 5 mod 11 = 5; (3*5) mod 11 = (3 mod 11) * 5 = (5 mod 11) * 3 = 4
假定该操作为'*',协议双方选择一种公钥p,个人私钥p1,p2(只有自己知道)
p * p1 = r1; p * p2 = r2; key = r1 * p2 = r2 * p1
这样就得出了只有协议双方才知道的密钥key.
以上的操作很类似于抽象代数里的群。
纠错码
本质而言,我理解,就是冗余信息进行容错。
- 简单校验和。(checkSum)
- 阶梯校验和。(通过位置+值计算)
- 将校验和进行二维应用,即可定位到错误的地方。
图形识别
主要模式就是 1. 训练 2. 分类
- 邻近者模式 > 对每个像素做异或,寻找差异最小的模式
- 决策树 > 学习过程没有太明白,分类就按照决策树遍历即可。
- 神经网络 > 学习过程同样没有太明白。分类:现实问题作为输入映射到神经元,神经元的阀值触发信号,汇聚到下一级神经元,一直到最终决定。
数据压缩
本质上就是查找重复模式
无损压缩
- 同前
- 根据词频进行更短符号
- TODO 霍夫曼编码
有损压缩
- 图片(隔行列删除像素信息)
- JPEG(像素块内寻找模式-比如分成8*8的块状信息体)
数据库
- 事物 作为待办事项,写redo-log,保证操作幂等。
- 复制提交
- 回滚
- 预备提交
- 虚表
数字签名
TODO 再仔细看一看
不可判定问题
构造冲突的命题
- 构造一类程序用于判断程序是否会崩溃
canCrash—>canCrashWired—>crashOnSelf—>antiCrashOnSelf
| | canCrash | canCrashWired | crashOnSelf | antiCrashOnSelf | |----------+----------+---------------+-------------+-----------------| | 输入条件 | 程序 | 程序 | 自身 | 自身 | | 能崩溃 | yes | 崩溃 | 崩溃 | yes | | 不能崩溃 | no | no | no | 崩溃 | |----------+----------+---------------+-------------+-----------------|